﻿using pdfer.FileObjects;
using pdfer.Syntax;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace pdfer.PdfObjecs
{
    internal class DocCatalogDictionary : PdfFileObject
    {
        // /Type*               name    必须是/Catalog
        // /Pages*              间接引用字典  页面树的根节点。页面树在第42页的“页面和页面树”中讨论
        // /PageLabels          number tree 一个数字树，给出了该文档的页面标签。这种机制允许文档中的页面具有比1,2,3更复杂的编号….例如，书籍的前言可以编号为i，ii，iii ……，而主要内容 再次以1,2,3开始….这些页面标签显示在PDF查看器中 - 它们与打印输出无关
        // /Names               dictionary  名字词典。它包含各种名称树，它们将名称映射到实体，以防止必须使用对象编号直接引用它们
        // /Dests               dictionary  将名称映射到目标的字典。目的地是超链接向用户发送的PDF文档中的位置的描述
        // /ViewerPreferences   dictionary  一个查看器首选项字典，允许标志指定在屏幕上查看文档时的PDF查看器的行为，例如打开文档的页面，初始查看比例等
        // /PageLayout name     指定PDF查看器要使用的页面布局。值为/SinglePage，/OneColumn，/TwoColumnLeft，/TwoColumnRight，/TwoPageLeft，/TwoPageRight。（默认值：/SinglePage）。详情见ISO 32000-1:2008的表28
        // /PageMode name       指定PDF查看器要使用的页面模式。值为/UseNone，/UseOutlines，/UseThumbs，/FullScreen，/UseOC，/UseAttachments。 （默认值：/UseNone）。详情见ISO 32000-1:2008的表28
        // /Outlines            间接引用字典  大纲字典是文档大纲的根，通常称为书签
        // /Metadata            间接引用流   文档的XMP元数据 - 请参阅第93页的“XML元数据”

        public DocCatalogDictionary(PdfFileObject pdfFileObject)
            : base(pdfFileObject)
        {
            if (pdfFileObject.TryGetValue(PdfName.Key_Type, out object? val))
            {
                Type = PdfParserUtils.ParseString(val);
                if (Type != PdfTypeConst.Type_Catalog)
                {
                    throw new Exception("类型必须是 /Catalog");
                }
            }
        }

        /// <summary>
        /// 必须是/Catalog
        /// (Required)
        /// </summary>
        public String Type { get; private set; }
        private String? _version;
        /// <summary>
        /// 版本 优先级低于文件头指定的版本
        /// <exapmle>/1.4</exapmle>
        /// </summary>
        public String? Version 
        {
            get 
            {
                if (_version == null && TryGetValue(PdfName.Key_Version, out var obj))
                {
                    _version = PdfParserUtils.ParseString(obj);
                }
                return _version;
            }
        }
        private String _pages;
        /// <summary>
        /// 间接引用字典  页面树的根节点。
        /// (Required)
        /// 对象引用
        /// </summary>
        public String Pages
        {
            get
            {
                if (_pages == null && TryGetValue(PdfName.Key_Pages, out var obj))
                {
                    _pages = PdfParserUtils.ParseString(obj);
                }
                return _pages;
            }
        }
        private String _pageLabels;
        /// <summary>
        /// number tree 一个数字树，给出了该文档的页面标签。
        /// </summary>
        public String PageLabels
        {
            get
            {
                if (_pageLabels == null && TryGetValue(PdfName.Key_PageLabels, out var obj))
                {
                    _pageLabels = PdfParserUtils.ParseString(obj);
                }
                return _pageLabels;
            }
        }
        private String _names;
        /// <summary>
        /// dictionary  名字词典。
        /// 对象引用
        /// </summary>
        public String Names
        {
            get
            {
                if (_names == null && TryGetValue(PdfName.Key_Names, out var obj))
                {
                    _names = PdfParserUtils.ParseString(obj);
                }
                return _names;
            }
        }

        private List<String> _dests; 
        /// <summary>
        /// dictionary  将名称映射到目标的字典。
        /// </summary>
        public List<String> Dests
        {
            get
            {
                if (_dests == null && TryGetValue(PdfName.Key_Dests, out var obj))
                {
                    _dests = ParseList<String>(obj, PdfParserUtils.Trans2String);
                }
                return _dests;
            }
        }

        private String _pageLayout;
        /// <summary>
        /// 指定PDF查看器要使用的页面布局。
        /// 值为
        ///     /SinglePage，/OneColumn，/TwoColumnLeft，/TwoColumnRight，/TwoPageLeft，/TwoPageRight。
        ///     （默认值：/SinglePage）。
        /// </summary>
        public String PageLayout
        {
            get
            {
                if (_pageLayout == null && TryGetValue(PdfName.Key_PageLayout, out var obj))
                {
                    _pageLayout = PdfParserUtils.ParseString(obj);
                }else
                {
                    _pageLayout = "/SinglePage";
                }
                return _names;
            }
        }

        private Dictionary<String, Object>  _viewerPreferences;

        /// <summary>
        /// dictionary  一个查看器首选项字典，允许标志指定在屏幕上查看文档时的PDF查看器的行为
        /// </summary>
        public Dictionary<String, Object> ViewerPreferences
        {
            get
            {
                if (_viewerPreferences == null && TryGetValue(PdfName.Key_ViewerPreferences, out var obj))
                {
                    _viewerPreferences = ParseDictionary(obj);
                }
                
                return _viewerPreferences;
            }
        }

        private String _pageMode;
        /// <summary>
        /// 指定PDF查看器要使用的页面模式。
        /// 值为
        ///     /UseNone，/UseOutlines，/UseThumbs，/FullScreen，/UseOC，/UseAttachments。
        ///     （默认值：/UseNone）。
        /// </summary>
        public String PageMode
        {
            get
            {
                if (_pageMode == null && TryGetValue(PdfName.Key_PageMode, out var obj))
                {
                    _pageMode = PdfParserUtils.ParseString(obj);
                }
                else
                {
                    _pageMode = "/UseNone";
                }
                return _names;
            }
        }
        private String _outlines;
        /// <summary>
        /// 间接引用字典  大纲字典是文档大纲的根，通常称为书签
        /// </summary>
        public String Outlines
        {
            get
            {
                if (_outlines == null && TryGetValue(PdfName.Key_Outlines, out var obj))
                {
                    _outlines = PdfParserUtils.ParseString(obj);
                }
                return _outlines;
            }
        }
        private String _metadata;
        /// <summary>
        /// 间接引用流   文档的XMP元数据 - 请参阅第93页的“XML元数据”
        /// </summary>
        public String Metadata
        {
            get
            {
                if (_metadata == null && TryGetValue(PdfName.Key_Metadata, out var obj))
                {
                    _metadata = PdfParserUtils.ParseString(obj);
                }
                return _metadata;
            }
        }

        /// <summary>
        /// Array or dictionary
        /// </summary>
        public Object OpenAction { get; set; }

        /// <summary>
        ///  An additional-actions dictionary defining the actions
        ///  to be taken in response to various trigger events affecting the document
        ///  as a whole(see “Trigger Events” on page 648). (See also
        ///  implementation note 34 in Appendix H.)
        /// </summary>
        public String AA { get; set; }

        /// 还有其他的名称未列出
        /// 碰到再处理
    }
}
